home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / lboss03c.lzh / enemy.c < prev    next >
C/C++ Source or Header  |  1999-04-27  |  10KB  |  469 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "main.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8. #include "parts.h"
  9.  
  10. #define ENEMY_MAX    256    /* 最大数 */
  11.  
  12.  
  13. #define P1_K    0.5        /* ばね定数(左右大パーツ) */
  14. #define P1_M    0.2        /* 摩擦計数(左右大パーツ) */
  15. #define P1_V    0.5        /* 速度がこれ以下なら次へ(左右大パーツ) */
  16. #define P1_L    0.4        /* 座標がこれ以下なら次へ(左右大パーツ) */
  17.  
  18. /* 2段階目大パーツ合体時 */
  19. #define P3_K    1.5        /* ばね定数 */
  20. #define P3_M    0.10        /* 摩擦計数 */
  21. #define P3_V    0.8        /* 速度がこれ以下なら次へ */
  22. #define P3_L    0.8        /* 座標がこれ以下なら次へ */
  23.  
  24. /* 2段階目左右翼パーツ */
  25. #define P5_K    3.0        /* ばね定数(左右上小パーツ) */
  26. #define P5_M    0.02        /* 摩擦計数(左右上小パーツ) */
  27. #define P5_V    0.1        /* 速度がこれ以下なら次へ(左右上小パーツ) */
  28. #define P5_L    0.1        /* 座標がこれ以下なら次へ(左右上小パーツ) */
  29.  
  30. /* 2段階目左右耳パーツ */
  31. #define P7_K    3.0        /* ばね定数(左右上小パーツ) */
  32. #define P7_M    0.02        /* 摩擦計数(左右上小パーツ) */
  33. #define P7_V    0.1        /* 速度がこれ以下なら次へ(左右上小パーツ) */
  34. #define P7_L    0.1        /* 座標がこれ以下なら次へ(左右上小パーツ) */
  35.  
  36.  
  37. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  38.  *enemy_null_top,        /* 空のワークのリスト */
  39.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  40.  
  41. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  42.  
  43. extern char end_of_data;
  44. extern char f_option_flag;
  45.  
  46. typedef struct _spwork {
  47.     signed short x, y;    /* 座標 */
  48.     unsigned short pt;    /* スプライトパターンNo. */
  49.     unsigned short info;    /* 反転コード・色・優先度を表わすデータ */
  50. } SPWORK;
  51.  
  52.  
  53. SPWORK spwork;
  54.  
  55. FILE *fp_parts3, *fp_parts5, *fp_parts6, *fp_parts7, *fp_parts8;
  56.  
  57.  
  58. int EnemyInit0 (void)
  59. {
  60.     int i;
  61.  
  62.     /* リストをつなげる */
  63.     enemy_top = NULL;
  64.     enemy_end = NULL;
  65.     enemy_null_top = enemy;
  66.     for (i = 0; i < ENEMY_MAX; i++)
  67.         enemy[i].next = &enemy[i + 1];
  68.  
  69.     enemy[ENEMY_MAX - 1].next = NULL;
  70.  
  71.     return (0);
  72. }
  73.  
  74.  
  75.  
  76. void EnemyInit (unsigned short type, unsigned short info,
  77.         signed short ox, signed short oy, ENEMY * parent)
  78. {
  79.     ENEMY *p;
  80.  
  81.     if (enemy_null_top == NULL) {
  82.         printf ("ワークが一杯です\n");
  83.         return;        /* 空きのワークがない(キャラクターオーバー) */
  84.     }
  85.     /* リストの末尾に新しいノードを追加 */
  86.     p = enemy_null_top;
  87.     enemy_null_top = p->next;
  88.     if (enemy_top == NULL)
  89.         enemy_top = p;
  90.     else
  91.         enemy_end->next = p;
  92.     p->next = NULL;
  93.     enemy_end = p;
  94.  
  95.     p->type = type;
  96.     p->info = info;
  97.     p->ox = ox;
  98.     p->oy = oy;
  99.     p->x = 0;
  100.     p->y = 0;
  101.     p->parent = parent;
  102.  
  103.     p->lx = 0.0;
  104.     p->ly = 0.0;
  105.     p->lz = 0.0;
  106.     p->vx = 0.0;
  107.     p->vy = 0.0;
  108.     p->vz = 0.0;
  109.     p->cyc = 0;
  110.     p->cyc1 = 0;
  111.  
  112.     switch (p->type) {
  113.     case 0:        /* コア */
  114.         //if (f_option_flag)
  115.             //fp_parts3 = fopen ("parts3.doc", "w");
  116.         p->lz = 9.0;
  117.         p->ox = 0;
  118.         break;
  119.     default:
  120.         break;
  121.     }
  122. }
  123.  
  124.  
  125. /* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
  126. static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
  127. {
  128.     short h;
  129.  
  130.     for (h = 0; h < sp_num; h++) {
  131.         p->x = p->lx + p->ox;
  132.         p->y = p->ly + p->oy;
  133.         if (p->parent != NULL) {
  134.             spwork.x = p->x + p->parent->x + parts_table[h].x;
  135.             spwork.y = p->y + p->parent->y + parts_table[h].y;
  136.         } else {
  137.             spwork.x = p->x + parts_table[h].x;
  138.             spwork.y = p->y + parts_table[h].y;
  139.         }
  140.         spwork.pt = parts_table[h].pt;
  141.         spwork.info = p->info;
  142.  
  143.         spwork.x += (128 + 16);    /* 表示用に補正 */
  144.         spwork.y += (128 + 16);
  145.         xsp_set_st (&spwork);
  146.         fxsp_set_st (&spwork);
  147.         spwork.x -= (128 + 16);
  148.         spwork.y -= (128 + 16);
  149.     }
  150. }
  151.  
  152.  
  153.  
  154. void EnemyMove (void)
  155. {
  156.     ENEMY *p, *q;
  157.  
  158.     p = enemy_top;
  159.     q = NULL;
  160.     while (p != NULL) {
  161.         char erase_flag = 0;
  162.  
  163.         switch (p->type) {
  164.         case 0:    /* コア */
  165.             p->lx = p->lz * cos (p->round) - 8.0;
  166.             p->ly = p->lz * sin (p->round) - 8.0;
  167.             DispSp (p, 1, parts0_table);
  168.             p->lx = p->lz * cos (p->round+M_PI*0.5) - 8.0;
  169.             p->ly = p->lz * sin (p->round+M_PI*0.5) - 8.0;
  170.             DispSp (p, 1, parts0_table);
  171.             p->lx = p->lz * cos (p->round+M_PI*1.0) - 8.0;
  172.             p->ly = p->lz * sin (p->round+M_PI*1.0) - 8.0;
  173.             DispSp (p, 1, parts0_table);
  174.             p->lx = p->lz * cos (p->round+M_PI*1.5) - 8.0;
  175.             p->ly = p->lz * sin (p->round+M_PI*1.5) - 8.0;
  176.             DispSp (p, 1, parts0_table);
  177.  
  178.             p->round += M_PI / 2.0 /16.0;
  179.             if (seq_counter == 15)
  180.                 erase_flag = !0;
  181.             break;
  182.  
  183.         case 1:    /* 1段階目で分離した本体 */
  184.             DispSp (p, 24, parts1_table);
  185.             if (seq_counter == 58)
  186.                 erase_flag = !0;
  187.             break;
  188.         case 2:    /* 1段階目で分離した頭 */
  189.             DispSp (p, 30, parts2_table);
  190.             erase_flag = !0;
  191.             break;
  192.  
  193.         case 3:    /* 2段階目大パーツ */
  194.             switch (p->cyc) {
  195.             case 0:
  196.                 p->ly += p->vy;
  197.                 if (p->ly < 32.0)
  198.                     p->cyc++;
  199.                 break;
  200.             case 1:
  201.                 if ((p->ly > 1.0) && (p->vy < -1.2))
  202.                     p->vy += 0.8;
  203.                 p->ly += p->vy;
  204.                 if (p->ly < 1.0)
  205.                     p->cyc++;
  206.                 break;
  207.             case 2:/* ばね振動 */
  208.                 p->vy -= p->ly * P3_K;
  209.                 /* 摩擦 */
  210.                 if (p->vy > 0)
  211.                     p->vy -= P3_M;
  212.                 else
  213.                     p->vy += P3_M;
  214.                 p->ly += p->vy;
  215.                 if ((fabs (p->vy) < P3_V) && (fabs (p->ly) < P3_L)) {
  216.                     p->cyc++;    /* 次へ */
  217.                     p->lx = 0.0;
  218.                     p->ly = 0.0;
  219.                     p->vx = 0.0;
  220.                     p->vy = 0.0;
  221.                 }
  222.                 break;
  223.             case 3:
  224.                 erase_flag = !0;
  225.                 break;
  226.             default:
  227.                 break;
  228.             }
  229.             if (f_option_flag)
  230.                 fprintf (fp_parts3, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  231.             DispSp (p, 60, parts3_table);
  232.             break;
  233.  
  234.         case 4:    /* 2段階目本体 */
  235.             DispSp (p, 90, parts4_table);
  236.             break;
  237.  
  238.         case 5:    /* 左翼パーツ */
  239.             switch (p->cyc) {
  240.             case 0:
  241.                 p->cyc++;    /* 次へ */
  242.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  243.                 p->vz = 0.0;
  244.                 break;
  245.             case 1:/* 加速度的に離れる */
  246.                 if (p->vz < 0.20)
  247.                     p->vz += 0.10;
  248.                 p->lz += p->vz;
  249.                 p->lx = (18 - 54) * p->lz;    /* 終点-始点 */
  250.                 p->ly = (168 - 143) * p->lz;
  251.                 if (p->lz > 1.0) {
  252.                     p->cyc++;    /* 次へ */
  253.                     p->lz = 0.0;
  254.                     p->lx = 0.0;    /* 今度はここが原点になる */
  255.                     p->ly = 0.0;
  256.                     p->ox += (18 - 54);
  257.                     p->oy += (168 - 143);
  258.                 }
  259.                 break;
  260.             case 2:/* ばね振動 */
  261.                 p->vz -= p->lz * P5_K;
  262.                 /* 摩擦 */
  263.                 if (p->vz > 0)
  264.                     p->vz -= P5_M;
  265.                 else
  266.                     p->vz += P5_M;
  267.                 p->lz += p->vz;
  268.                 p->lx = (18 - 54) * p->lz;
  269.                 p->ly = (168 - 143) * p->lz;
  270.                 if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
  271.                     p->cyc++;    /* 次へ */
  272.                     p->lx = 0.0;
  273.                     p->ly = 0.0;
  274.                     p->vx = 0.0;
  275.                     p->vy = 0.0;
  276.                 }
  277.                 break;
  278.             default:
  279.                 break;
  280.             }
  281.             if (f_option_flag)
  282.                 fprintf (fp_parts5, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  283.             DispSp (p, 16, parts5_table);
  284.             break;
  285.  
  286.         case 6:    /* 右翼パーツ */
  287.             switch (p->cyc) {
  288.             case 0:
  289.                 p->cyc++;    /* 次へ */
  290.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  291.                 p->vz = 0.0;
  292.                 break;
  293.             case 1:/* 加速度的に離れる */
  294.                 if (p->vz < 0.20)
  295.                     p->vz += 0.10;
  296.                 p->lz += p->vz;
  297.                 p->lx = -(18 - 54) * p->lz;    /* 終点-始点 */
  298.                 p->ly = (168 - 143) * p->lz;
  299.                 if (p->lz > 1.0) {
  300.                     p->cyc++;    /* 次へ */
  301.                     p->lz = 0.0;
  302.                     p->lx = 0.0;    /* 今度はここが原点になる */
  303.                     p->ly = 0.0;
  304.                     p->ox -= (18 - 54);
  305.                     p->oy += (168 - 143);
  306.                 }
  307.                 break;
  308.             case 2:/* ばね振動 */
  309.                 p->vz -= p->lz * P5_K;
  310.                 /* 摩擦 */
  311.                 if (p->vz > 0)
  312.                     p->vz -= P5_M;
  313.                 else
  314.                     p->vz += P5_M;
  315.                 p->lz += p->vz;
  316.                 p->lx = -(18 - 54) * p->lz;
  317.                 p->ly = (168 - 143) * p->lz;
  318.                 if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
  319.                     p->cyc++;    /* 次へ */
  320.                     p->lx = 0.0;
  321.                     p->ly = 0.0;
  322.                     p->vx = 0.0;
  323.                     p->vy = 0.0;
  324.                 }
  325.                 break;
  326.             default:
  327.                 break;
  328.             }
  329.             if (f_option_flag)
  330.                 fprintf (fp_parts6, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  331.             DispSp (p, 16, parts6_table);
  332.             break;
  333.  
  334.         case 7:    /* 左耳パーツ */
  335.             switch (p->cyc) {
  336.             case 0:
  337.                 p->cyc++;    /* 次へ */
  338.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  339.                 p->vz = 0.0;
  340.                 break;
  341.             case 1:/* 加速度的に離れる */
  342.                 if (p->vz < 0.20)
  343.                     p->vz += 0.10;
  344.                 p->lz += p->vz;
  345.                 p->lx = (65 - 68) * p->lz;    /* 終点-始点 */
  346.                 p->ly = (115 - 134) * p->lz;
  347.                 if (p->lz > 1.0) {
  348.                     p->cyc++;    /* 次へ */
  349.                     p->lz = 0.0;
  350.                     p->lx = 0.0;    /* 今度はここが原点になる */
  351.                     p->ly = 0.0;
  352.                     p->ox += (65 - 68);
  353.                     p->oy += (115 - 134);
  354.                 }
  355.                 break;
  356.             case 2:/* ばね振動 */
  357.                 p->vz -= p->lz * P7_K;
  358.                 /* 摩擦 */
  359.                 if (p->vz > 0)
  360.                     p->vz -= P7_M;
  361.                 else
  362.                     p->vz += P7_M;
  363.                 p->lz += p->vz;
  364.                 p->lx = (65 - 68) * p->lz;
  365.                 p->ly = (115 - 134) * p->lz;
  366.                 if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
  367.                     p->cyc++;    /* 次へ */
  368.                     p->lx = 0.0;
  369.                     p->ly = 0.0;
  370.                     p->vx = 0.0;
  371.                     p->vy = 0.0;
  372.                     end_of_data = !0;    /* debug */
  373.                 }
  374.                 break;
  375.             default:
  376.                 break;
  377.             }
  378.             if (f_option_flag)
  379.                 fprintf (fp_parts7, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  380.             DispSp (p, 9, parts7_table);
  381.             break;
  382.  
  383.         case 8:    /* 右耳パーツ */
  384.             switch (p->cyc) {
  385.             case 0:
  386.                 p->cyc++;    /* 次へ */
  387.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  388.                 p->vz = 0.0;
  389.                 break;
  390.             case 1:/* 加速度的に離れる */
  391.                 if (p->vz < 0.20)
  392.                     p->vz += 0.10;
  393.                 p->lz += p->vz;
  394.                 p->lx = -(65 - 68) * p->lz;    /* 終点-始点 */
  395.                 p->ly = (115 - 134) * p->lz;
  396.                 if (p->lz > 1.0) {
  397.                     p->cyc++;    /* 次へ */
  398.                     p->lz = 0.0;
  399.                     p->lx = 0.0;    /* 今度はここが原点になる */
  400.                     p->ly = 0.0;
  401.                     p->ox -= (65 - 68);
  402.                     p->oy += (115 - 134);
  403.                 }
  404.                 break;
  405.             case 2:/* ばね振動 */
  406.                 p->vz -= p->lz * P7_K;
  407.                 /* 摩擦 */
  408.                 if (p->vz > 0)
  409.                     p->vz -= P7_M;
  410.                 else
  411.                     p->vz += P7_M;
  412.                 p->lz += p->vz;
  413.                 p->lx = -(65 - 68) * p->lz;
  414.                 p->ly = (115 - 134) * p->lz;
  415.                 if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
  416.                     p->cyc++;    /* 次へ */
  417.                     p->lx = 0.0;
  418.                     p->ly = 0.0;
  419.                     p->vx = 0.0;
  420.                     p->vy = 0.0;
  421.                 }
  422.                 break;
  423.             default:
  424.                 break;
  425.             }
  426.             if (f_option_flag)
  427.                 fprintf (fp_parts8, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  428.             DispSp (p, 9, parts8_table);
  429.             break;
  430.  
  431.         default:
  432.             printf ("enemy_move() : バグってます\n");
  433.             break;
  434.         }
  435.  
  436.         if (erase_flag) {
  437.             if (q == NULL) {    /* リストの一番最初を削除 */
  438.                 enemy_top = p->next;
  439.                 p->next = enemy_null_top;
  440.                 enemy_null_top = p;
  441.                 q = NULL;
  442.                 p = enemy_top;
  443.             } else {
  444.                 q->next = p->next;
  445.                 p->next = enemy_null_top;
  446.                 enemy_null_top = p;
  447.                 p = q->next;
  448.             }
  449.         } else {
  450.             q = p;
  451.             p = p->next;
  452.         }
  453.     }
  454. }
  455.  
  456.  
  457. void EnemyTini (void)
  458. {
  459.     int i;
  460.  
  461.     /* リストをつなげる */
  462.     enemy_top = NULL;
  463.     enemy_null_top = enemy;
  464.     for (i = 0; i < ENEMY_MAX; i++)
  465.         enemy[i].next = &enemy[i + 1];
  466.  
  467.     enemy[ENEMY_MAX - 1].next = NULL;
  468. }
  469.